package java8;

import java.util.Optional;

public class OptionalTest {
    public static void main(String[] args) {
        //empty()：创建一个空的 Optional 对象，表示没有值。
        Optional<String> emptyOptional = Optional.empty();
        System.out.println(emptyOptional.isPresent()); // 输出: false

        //of()：创建一个非空的 Optional 对象，值不能为空。
        Optional<String> nonEmptyOptional = Optional.of("Hello");
        System.out.println(nonEmptyOptional.isPresent()); // 输出: true
        System.out.println(nonEmptyOptional.get()); // 输出: Hello

        //ofNullable()：创建一个可能为空的 Optional 对象。如果值为 null，则返回一个空的 Optional。
        Optional<String> nullableOptional = Optional.ofNullable(null);
        //isPresent()：检查 Optional 是否包含值。如果包含值，返回 true；否则返回 false
        System.out.println(nullableOptional.isPresent()); // 输出: false


        Optional<String> optional = Optional.of("Hello");
        if (optional.isPresent()) {
            System.out.println(optional.get());  // 输出: Hello
        }

        // 或者使用 ifPresent
        optional.ifPresent(System.out::println); // 输出: Hello

        //get()：返回 Optional 中的值，如果没有值，会抛出 NoSuchElementException。
        String value = optional.get();
        System.out.println(value);  // 输出: Hello

        //orElse()：如果 Optional中包含值，则返回该值；否则返回指定的默认值。
        Optional<String> optionalNull = Optional.ofNullable(null);
        String result = optionalNull.orElse("Default Value");
        System.out.println(result);  // 输出: Default Value

        //orElseGet()：接受一个 Supplier 函数，只有在 Optional 为空时才会执行该函数。
        System.out.println(optionalNull.orElseGet(() -> "Generated Default Value")); // 输出: Generated Default Value

        //orElseThrow()：如果 Optional 为空，则抛出指定的异常。
        String val = optional.orElseThrow(() -> new IllegalArgumentException("Value not present"));

        //map()：如果 Optional 中有值，则对值应用给定的函数，并返回一个新的 Optional。
        Optional<String> upperCaseOptional = optional.map(String::toUpperCase);
        System.out.println(upperCaseOptional.get());  // 输出: HELLO

        //flatMap()：返回的 Optional 为空，它不会再封装为 Optional，而是直接返回该空值。
        Optional<String> res = optional.flatMap(s -> Optional.of(s.toUpperCase()));
        System.out.println(res.get());  // 输出: HELLO

        //filter()：如果 Optional 中的值符合指定的条件，则返回 Optional，否则返回空的 Optional。
        Optional<String> filtered = optional.filter(s -> s.length() > 3);
        System.out.println(filtered.get());  // 输出: hello


    }
}
